package com.bestcem.xm.user.service;

import com.alibaba.fastjson.JSONObject;
import com.bestcem.xm.common.core.domain.web.ServiceResult;
import com.bestcem.xm.user.enums.UserGroupOperateUserEnum;
import com.bestcem.xm.user.grpc.service.param.GroupIdsPageParam;
import com.bestcem.xm.user.service.dto.PageResponseDTO;
import com.bestcem.xm.user.service.dto.group.DelUserFromGroupDTO;
import com.bestcem.xm.user.service.dto.group.SaveUserToGroupDTO;
import com.bestcem.xm.user.service.dto.group.UserUserGroupDTO;
import com.bestcem.xm.user.service.dto.group.UserWithGroupDTO;

import java.util.List;
import java.util.Map;

/**
 * 用户组关联组织
 *
 * @author Linked <zhijian.lin@idiaoyan.com>
 * @version v1.0
 * @date 2021/12/29 16:00
 */
public interface UserUserGroupService {


    /**
     * 保存用户关联组织
     *
     * @param userToGroupDTO:
     * @return 主键id
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/1/6 17:32
     */
    ServiceResult<String> saveUserToGroup(SaveUserToGroupDTO userToGroupDTO);

    /**
     * 批量插入用户关联组织
     *
     * @param userGroups
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < java.lang.String>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/7/4 19:19
     */
    ServiceResult<Integer> insertUserGroupList(List<UserUserGroupDTO> userGroups);

    /**
     * 将用户从组织中移除
     *
     * @param param :
     * @return
     * @author Linked <zhijian.lin@idiaoyan.com>
     * @date 2022/1/6 17:31
     */
    ServiceResult<Integer> deleteUserFromGroup(DelUserFromGroupDTO param);


    /**
     * 获取指定用户组下的用户id列表
     *
     * @param param
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < com.bestcem.xm.user.group.entity.pojo.ListUserFromGroupDO>>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/1/25 14:23
     */
    ServiceResult<List<String>> listUserFromGroups(GroupIdsPageParam param);

    /**
     * 查询当前组织列表下的所有账号数量
     *
     * @param groupIds 用户组id列表
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/7/4 16:49
     */
    ServiceResult<Integer> getUserCountByGroupIds(List<String> groupIds);

    /**
     * 批量操作用户组的用户列表信息
     *
     * @param groupId       用户组id
     * @param rootGroupId   根组织id
     * @param operate       操作类型
     * @param userIds       用户id列表
     * @param operateUserId 操作人ID
     * @return com.bestcem.xm.util.ServiceResult<java.lang.Integer>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2021/12/30 16:14
     */
    ServiceResult<Integer> batchOperateUser(String groupId, String rootGroupId, UserGroupOperateUserEnum operate,
                                            List<String> userIds, String operateUserId);

    /**
     * 通过groupId和userId查询账号与组织的关联关系
     *
     * @param rootGroupId 根组织id
     * @param groupId     组织id
     * @param userId      用户id
     * @return
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/1/4 13:50
     */
    ServiceResult<List<UserUserGroupDTO>> listByGroupIdAndUserId(String rootGroupId, String groupId, String userId);

    /**
     * 更新用户关联组列表信息
     *
     * @param orgId        租户id
     * @param userId       用户id
     * @param groupIdsList 组织id列表
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < java.lang.String>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/01/24 11:52
     */
    ServiceResult<List<String>> updateUserGroups(String orgId, String userId, List<String> groupIdsList);


    /**
     * 根据rootGroupID、UserID、groupID获取用户组关联信息列表
     *
     * @param userUserGroupDTO 前端传入的usergroup
     * @param page             页数
     * @param size             分页大小
     * @return com.bestcem.xm.util.ServiceResult<PageResponseDTO < UserUserGroupDTO>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/07/04 15:32
     */
    ServiceResult<PageResponseDTO<UserUserGroupDTO>> getUserUserGroupList(UserUserGroupDTO userUserGroupDTO, Integer page, Integer size);

    /**
     * 查询对应的用户数量
     *
     * @param groupIds 组织id列表
     * @return com.bestcem.xm.util.ServiceResult<java.util.Map < java.lang.String, java.lang.Integer>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/02/08 14:08
     */
    ServiceResult<Map<String, Integer>> countUserNumByGroupIds(List<String> groupIds);

    /**
     * 查询对应的用户数量
     */
    long countUserNumByGroupIdAndLevelId(String groupId, String groupLevelId);

    /**
     * 根据userId查询关联的groupId列表
     *
     * @param userId
     * @return java.util.List<java.lang.String>
     * @author panyun <yun.pan@idiaoyan.com>
     * @date 2022/2/11 0:00
     */
    ServiceResult<List<String>> getGroupIdsByUserId(String userId);


    /**
     * 查询用户所关联的组织信息(激活的组织)
     *
     * @param userId 用户id
     * @return java.util.List<com.bestcem.xm.user.entity.pojo.UserWithGroupDO>
     * @author Linzhijian <zhijian.lin@idiaoyan.com>
     * @date 2022/03/25 19:14
     */
    ServiceResult<List<UserWithGroupDTO>> getUserWithGroup(String userId);

    /**
     * 根据组织id查询当前组的用户id列表
     *
     * @param groupId 组织id
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < java.lang.String>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/05/17 21:47
     */
    ServiceResult<List<String>> listByGroupId(String groupId);

    /**
     * 根据相关参数查询groupId列表
     *
     * @param userUserGroupDTO 参数信息
     * @return com.bestcem.xm.util.ServiceResult<java.util.List < java.lang.String>>
     * @author cuiqiongyu <qiongyu.cui@idiaoyan.cn>
     * @date 2022/06/08 16:28
     */
    ServiceResult<List<String>> listGroupIdBySelective(UserUserGroupDTO userUserGroupDTO);

    /**
     * 删除绑定在组织下的账号的关联关系
     *
     * @param groupId
     * @return ServiceResult<Integer>
     * @author wangyunyun <yunyun.wang@idiaoyan.com>
     * @date 2022/8/9 15:25
     */
    ServiceResult<Integer> deleteByGroupId(String groupId);

    ServiceResult<Void> putGroupTree(String orgId, JSONObject obj);

    //void multiGroupTree(String orgId, Boolean is_total);
}
